[Python] 環境変数の指定でboto3がSTSのリージョナルエンドポイントを使用するか確認してみた
こんにちは。サービス開発室の武田です。
先日のSTS障害を受けて、あらためてSTSのベストプラクティスが社内でも共有されていました。
具体的にリージョナルエンドポイントを使用する方法はAWSブログが詳しいです。
実はAWS_STS_REGIONAL_ENDPOINTS=regional
を指定する方法を知らなかったのですが、次のドキュメントにもまとめられています。
このページ、ちゃんと見てみるとSDK for Python (Boto3)
の SupportedがYes となっていますね。client
の引数に指定する方法以外にもあるんだ!ということで、次のようなLambda関数を用意して確認してみました。
なお関数は東京リージョンに作成しました。
import logging
import boto3
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
def lambda_handler(event, context):
sts = boto3.client("sts")
res = sts.assume_role(RoleArn="arn:aws:iam::123456789012:role/test-role", RoleSessionName="test")
環境変数での指定なし
まずはデフォルトの状態を確認してみましょう。直近の動作を見ても、グローバルエンドポイントを使用するはずです。
[DEBUG] 2024-08-31T09:00:00.000Z 8d6f3478-223f-4d95-80c5-947717f390ba Calling endpoint provider with parameters: {'Region': 'ap-northeast-1', 'UseDualStack': False, 'UseFIPS': False, 'UseGlobalEndpoint': True}
[DEBUG] 2024-08-31T09:00:00.000Z 8d6f3478-223f-4d95-80c5-947717f390ba Endpoint provider result: https://sts.amazonaws.com
パラメーターがUseGlobalEndpoint: True
となっており、エンドポイントはhttps://sts.amazonaws.com
です。これはグローバルエンドポイントを使用していますね。
環境変数でAWS_STS_REGIONAL_ENDPOINTS=regionalを指定する
続いて、同じ関数に環境変数を設定しましょう。設定するのはAWS_STS_REGIONAL_ENDPOINTS=regional
です。
結果はこちら。
[DEBUG] 2024-08-31T09:00:00.000Z 8a70e1e6-7ca0-4b68-89bc-8f9e3dd46667 Calling endpoint provider with parameters: {'Region': 'ap-northeast-1', 'UseDualStack': False, 'UseFIPS': False, 'UseGlobalEndpoint': False}
[DEBUG] 2024-08-31T09:00:00.000Z 8a70e1e6-7ca0-4b68-89bc-8f9e3dd46667 Endpoint provider result: https://sts.ap-northeast-1.amazonaws.com
パラメーターがUseGlobalEndpoint: False
になっています。エンドポイントはhttps://sts.ap-northeast-1.amazonaws.com
で、Lambda関数が動いているリージョンと同じリージョナルエンドポイントを使用しています。
問題なく、環境変数の値が動作していることが確認できました。
まとめ
他のAWS SDKもサポート表を見る限り大部分がこの方法をサポートしているようです。今回はboto3の環境で確認してみました。AWS_STS_REGIONAL_ENDPOINTS=regional
を環境変数で指定するだけでリージョナルエンドポイントに切り替えらます。コードの修正も必要ないため、手軽な方法ではないでしょうか。